#![cfg_attr(
    all(not(debug_assertions), target_os = "windows"),
    windows_subsystem = "windows"
)]

use serde::Serialize;
// use std::{thread, time};
use tauri::{Manager, SystemTrayEvent, Window};

use app::init_tauri::{
    create_menu, create_system_tray, menu_event_handle, open_devtools, tray_click_handle,
    tray_menu_item_click_handle,
};
use app::invoke::{
    __cmd__get_sym_info, // 这里要注意一下导入名, 因为使用了模块化
    __cmd__test_handle,
    get_sym_info,
    test_handle,
};

// 事件参数必须实现 Clone, Serialize 特征
#[derive(Clone, Serialize)]
struct Payload {
    message: String,
    name: String,
    age: u16,
}

// 发出 after-end-event事件
#[tauri::command]
fn emit_event(window: Window) {
    // 给指定的窗口发出事件
    window
        .emit(
            "after-end-event",
            Payload {
                message: "后端事件携带的消息".into(),
                name: "张三".to_string(),
                age: 18,
            },
        )
        .unwrap();

    // 无限循环的发出事件, 可以实时的获取电脑信息, 比如: 内存大小, 温度等
    //  (不使用线程的话, 程序会卡死在这里, 可以使用 break 或 return 就可以退出 loop 循环)
    // std::thread::spawn(move || loop {
    //     window
    //         .emit(
    //             "after-end-event",
    //             Payload {
    //                 message: "后端事件携带的消息".into(),
    //                 name: "张三".to_string(),
    //                 age: 18
    //             },
    //         )
    //         .unwrap();
    //     // 休眠 500ms
    //     thread::sleep(time::Duration::from_millis(500));
    // });
}

#[allow(dead_code)]
fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![
            get_sym_info,
            test_handle,
            emit_event
        ]) // 提供命令列表(供 js 调用的 rust 函数)
        .system_tray(create_system_tray()) // 创建托盘
        .on_system_tray_event(|app, event| match event {
            SystemTrayEvent::MenuItemClick { ref id, .. } => {
                tray_menu_item_click_handle(app, &event, id.as_str());
            }
            SystemTrayEvent::LeftClick { .. } => {
                tray_click_handle(app);
            }
            _ => {}
        })
        .menu(create_menu()) // 创建菜单
        .on_menu_event(|event| {
            menu_event_handle(&event);
        })
        .setup(|app| {
            // setup 钩子
            #[cfg(debug_assertions)] // 只在调试版本中包含此代码
            {
                println!("{}", "setup run...");
                let window = app.get_window("main").unwrap();
                window.set_focus().unwrap();
                open_devtools(&window);
            }

            // 监听所有窗口的事件
            let _id = app.listen_global("front-end-event", |event| {
                println!("rust  front-end-event event, params -> {:?}", event.payload());
            });

            // 解除监听
            // app.unlisten(_id);

            // 触发指定的事件到所有的窗口
            // app.emit_all(
            //     "after-end-event",
            //     Payload { message: "后端事件携带的消息".into() },
            // )
            // .unwrap();

            Ok(())
        })
        .run(tauri::generate_context!()) // 读取 `tauri.conf.json` 中的 `build.distDir` 并运行 tauri
        .expect("运行 tauri 应用程序时出错");
}
